//package com.yhcnet.test;
//
//public class FileUpload {
//
//    // 协调文件上传，文件先分片缓存到Redis，而后异步持久化至OSS
//    private List<File> getUploadFileInfoListAndUploadFileToOSS(MultipartFile[] myFile, String remark, User user) {
//
//        // 文件名合法的文件列表
//        List<File> fileList = new ArrayList<>();
//        Queue<PersistenceService.Product> uploadFileQueue = new LinkedList<>();
//
//        for (MultipartFile multipartFile : myFile) {
//
//            String fileName = multipartFile.getOriginalFilename();
//            if (StringUtils.isBlank(fileName)) {
//                continue;
//            }
//            fileName = fileName.replace(" ", "");
//            if (!checkUploadFileName(fileName)) {
//                continue;
//            }
//
//            long fileSize = multipartFile.getSize(); // 获取文件大小
//            String fileType = multipartFile.getContentType();
//            File file = assembleUploadFile(user, remark, fileName, fileSize, fileType);
//            String fileKey = Const.XCLOUD_FILE_CACHE_PREFIX + UUID.randomUUID();
//
//            long before = ThreadSafeDateUtil.now();
//            boolean flag = false;
//            for(;;) {
//                long left = memory.get();
//                if (memory.use(left, fileSize)) {
//                    break;
//                } else {
//                    long after = ThreadSafeDateUtil.now();
//                    if (after - before > TimeUnit.SECONDS.toMillis(3L)) {
//                        flag = true;
//                        break;
//                    }
//                }
//            }
//            if (flag) {
//                OSS ossClient = ossUtil.getOSSClient();
//                if (fileSize <= Const.SHARD_FILE_SIZE) {
//                    try {
//                        ossUtil.upload(ossClient, file.getRandomFileName(), file.getOldFileName(), multipartFile.getBytes());
//                        fileList.add(file);
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                    }
//                } else {
//                    InputStream in = null;
//                    String uploadId = null;
//                    try {
//                        in = multipartFile.getInputStream();
//                        uploadId = ossUtil.initShard(ossClient, file.getRandomFileName(), file.getOldFileName(), fileSize);
//                        int count;
//                        int shardIndex = 0;
//                        byte[] shard = new byte[Const.SHARD_FILE_SIZE];
//                        List<PartETag> partETagList = new ArrayList<>();
//                        while ((count = in.read(shard, 0, Const.SHARD_FILE_SIZE)) != -1) {
//                            PartETag partETag;
//                            if (count != Const.SHARD_FILE_SIZE) {
//                                byte[] realShard = new byte[count];
//                                System.arraycopy(shard, 0, realShard, 0, count);
//                                partETag = ossUtil.uploadShard(ossClient, file.getRandomFileName(), uploadId, realShard, ++shardIndex);
//                            } else {
//                                partETag = ossUtil.uploadShard(ossClient, file.getRandomFileName(), uploadId, shard, ++shardIndex);
//                            }
//                            partETagList.add(partETag);
//                        }
//                        ossUtil.submitShard(ossClient, file.getRandomFileName(), uploadId , partETagList);
//                        fileList.add(file);
//                    } catch (IOException e) {
//                        e.printStackTrace();
//                        if (StringUtils.isNotBlank(uploadId)) {
//                            ossUtil.cancelShard(ossClient, file.getRandomFileName(), uploadId);
//                        }
//                    } finally {
//                        if (in != null) {
//                            try {
//                                in.close();
//                            } catch (IOException ioException) {
//                                ioException.printStackTrace();
//                            }
//                        }
//                    }
//                }
//                ossClient.shutdown();
//            } else {
//                InputStream in = null;
//                try {
//                    in = multipartFile.getInputStream();
//                    PersistenceService.Product uploadFile = new PersistenceService.Product(file, fileKey);
//
//                    if (fileSize <= Const.SHARD_FILE_SIZE) {
//                        redisUtil.setFileCache(fileKey, multipartFile.getBytes());
//                    } else {
//
//                        int shardSize = (int) (fileSize / Const.SHARD_FILE_SIZE + (fileSize % Const.SHARD_FILE_SIZE > 0 ? 1 : 0));
//                        List<String> shardKeyList = new ArrayList<>(shardSize);
//
//                        int count;
//                        int shardIndex = 0;
//                        byte[] shard = new byte[Const.SHARD_FILE_SIZE];
//
//                        while ((count = in.read(shard, 0, Const.SHARD_FILE_SIZE)) != -1) {
//                            String shardKey = Const.XCLOUD_FILE_SHARD_CACHE_PREFIX + shardIndex++;
//                            if (count != Const.SHARD_FILE_SIZE) {
//                                byte[] realShard = new byte[count];
//                                System.arraycopy(shard, 0, realShard, 0, count);
//                                redisUtil.setFileCache(fileKey, shardKey, realShard);
//                            } else {
//                                redisUtil.setFileCache(fileKey, shardKey, shard);
//                            }
//                            shardKeyList.add(shardKey);
//                        }
//                        uploadFile.setShardKeyList(shardKeyList);
//                    }
//
//                    uploadFileQueue.offer(uploadFile);
//                    fileList.add(file);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                } finally {
//                    if (in != null) {
//                        try {
//                            in.close();
//                        } catch (IOException ioException) {
//                            ioException.printStackTrace();
//                        }
//                    }
//                }
//            }
//        }
//
//        // 文件名合法的文件列表不为空
//        if (!uploadFileQueue.isEmpty()) {
//            taskExecutor.execute(() -> persistenceService.production(uploadFileQueue));
//            return fileList;
//        }
//        return null;
//    }
//
//
//
//    private void consumption(int no) {
//
//        ReentrantLock lock = consumerLockList.get(no);
//        lock.lock();
//        try {
//
//            LinkedList<Product> productLink = shareProductList.get(no);
//            OSS ossClient = ossUtil.getOSSClient();
//            while (!productLink.isEmpty()) {
//
//                Product product = productLink.poll();
//                String fileKey = product.getRedisKey();
//                File file = product.getFile();
//                String randomName = file.getRandomFileName();
//
//                if (redisUtil.cacheKeyExists(fileKey)) { // key存在
//                    byte[] cache;
//                    if (product.getShardKeyList() == null) {
//                        cache = redisUtil.getFileCache(fileKey); // get
//                        ossUtil.upload(ossClient, randomName, file.getOldFileName(), cache);
//                    } else {
//
//                        String uploadId = ossUtil.initShard(ossClient, randomName, file.getOldFileName(), file.getFileSize());
//                        boolean complete = true;
//                        int i = 0;
//                        List<PartETag> partETagList = new ArrayList<>();
//                        for (String shardKey : product.getShardKeyList()) {
//                            if (!redisUtil.cacheKeyExists(fileKey, shardKey)) {
//                                ossUtil.cancelShard(ossClient, randomName, uploadId);
//                                failList.add(product);
//                                complete = false;
//                                break;
//                            }
//                            cache = redisUtil.getFileCache(fileKey, shardKey);
//                            PartETag partETag = ossUtil.uploadShard(ossClient, randomName, uploadId, cache, ++i);
//                            partETagList.add(partETag);
//                        }
//                        if (complete) {
//                            ossUtil.submitShard(ossClient, randomName, uploadId, partETagList);
//                        }
//                    }
//                    redisUtil.removeFileCache(fileKey);
//                } else {
//                    failList.add(product);
//                }
//
//                for(;;) {
//                    if (memory.release(memory.get(), file.getFileSize())) {
//                        break;
//                    }
//                }
//            }
//            ossClient.shutdown();
//            consumerConditionList.get(no).await();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } finally {
//            if (lock.isHeldByCurrentThread()) {
//                lock.unlock();
//            }
//        }
//    }
//
//}
